const MyPromise = require('./myPromise')
const myPromise = require('./myPromise')


// 代码测试
let promise1 = new Promise((resolve, reject) => {
    // resolve('11')
    setTimeout(() => {reject('22')}, 2000)
})

// promise1.then(res => {
//     console.log('promise')
//     console.log(res)
// }, error => {
//     setTimeout(()=>{
//         console.log(error)
//     }, 2000)
// })

let promise2 = new myPromise((resolve, reject) => {
    // resolve('11')
    setTimeout(() => {reject('my 22')}, 2000)
})

// promise2.then(res => {
//     console.log('mypromise')
//     console.log(res)
// }, error => {
//     console.log(error)
// })

let promise3 = new myPromise((resolve, reject) => {
    resolve('11')
    // reject('promise3 22')
})

// then(successCallback, failCallback) {
//     // 根据描述可以知当前回返值为 promise 对象 且 successCallback为空时 返回上一个promise的值， failCallback 为空时 抛出当前的 错误信息
//     successCallback = successCallback ? successCallback : value => value
//     failCallback = failCallback ? failCallback : errorInfo => {throw errorInfo}
//     // 初步实现
//     let promise2 = new MyPromise((resolve, reject) => {
//         // 根据当前状态 判断执行的方法
//         if (this.status === FULFILLEF) {
//             try {
//                 successCallback(this.value)
//             } catch (e) {
//                 this.reject(e)
//             }
//         }  else if (this.status === REJECTED) {
//             try {
//                 failCallback(this.value)
//             } catch (e) {
//                 this.reject(e)
//             }
//         } else {
//             try {
//                 this.successCallback.push(successCallback)
//                 this.failCallback.push(failCallback)
//             } catch (e) {
//                 this.reject(e)
//             }
//         }
//     })
//    return promise2
// }

// promise3.then(res => {
//     console.log('mypromise')
//     console.log(res)
//     return 33
// }).then(res => {
//     console.log(res)
// })

// MyPromise.resolve(promise3)
//     .then(res=> {
//         console.log(res)
//         return 88
//     })
//     .then(res => {
//         console.log(res)
//     })

// Promise.resolve('promise3').then(res=>{console.log(res)
//     return 1}).finally(res=>{console.log(123)})
// // Promise.reject(promise3)
// MyPromise.resolve('promise3').then(res=>{console.log(res)}).finally(res=>{console.log(123)})
// 发现第二个then方法没有接受上一个方法的返回值 并且执行

function p1 () {
    return new Promise(function (resolve, reject) {
      setTimeout(function () {
        resolve('p1')
      }, 2000)
    })
  }
  function p2 () {
    return new Promise(function (resolve, reject) {
        resolve('p2')
    })
  }
// let aa = [a1, a2, a3]
let a = [1,2,3,p1(),p2(),4,5]
// Promise.all(a).then(res => {
//     console.log('\nPromise\n', res)
// })
function p3 () {
    return new MyPromise(function (resolve, reject) {
      setTimeout(function () {
        resolve('p3')
      }, 2000)
    })
  }
  function p4 () {
    return new MyPromise(function (resolve, reject) {
        resolve('p4')
    })
  }
  let b = [1,2,3,p3(),p4(),4,5]
// MyPromise.all(b).then(res=> {
//     console.log('\nMyPromise\n', res)
// })

// console.log('\nPromise\n', b)
// console.log('\nMyPromise\n', d)

// Promise.race(a).then(res => {
//     console.log('\nPromise\n', res)
// })

// MyPromise.race(b).then(res=> {
//     console.log('\nMyPromise\n', res)
// })

// 该函数暂时不清楚是先进先出 还是谁先完成谁出 待完善
// MyPromise.any([p3(), p4()]).then(res=> {
//     console.log('\nMyPromise\n', res)
// })

// function p5 () {
//     return new Promise(function (resolve, reject) {
//       setTimeout(function () {
//         reject('p5')
//       }, 2000)
//     })
//   }
//   function p6 () {
//     return new Promise(function (resolve, reject) {
//         reject('p6')
//     })
//   }
// // 当前环境不支持
// Promise.allSettled([p5(), p6(), 7, 8, 9]).then(res => {
//     console.log('\nPromise\n', res)
// })

function p5 () {
    return new MyPromise(function (resolve, reject) {
      setTimeout(function () {
        reject('p5')
      }, 2000)
    })
  }
  function p6 () {
    return new MyPromise(function (resolve, reject) {
        reject('p6')
    })
  }
  MyPromise.allSettled([p5(), p6(), 7, 8, 9]).then(res => {
    console.log('\nMyPromise\n', res)
})